/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
'use strict'

var APP_DEFINITION_TOOLBAR = {
  ACTIONS: {
    saveModel: function(services) {
      _internalCreateModal(
        {
          backdrop: true,
          keyboard: true,
          template: 'views/popup/app-definition-save-model.html?version=' + Date.now(),
          scope: services.$scope
        },
        services.$modal,
        services.$scope
      )
    },

    help: function(services) {},

    feedback: function(services) {},

    closeEditor: function(services) {
      services.$location.path('/apps')
    }
  }
}

/** Custom controller for the save dialog */
angular.module('flowableModeler').controller('SaveAppDefinitionCtrl', [
  '$rootScope',
  '$scope',
  '$http',
  '$route',
  '$location',
  '$translate',
  function($rootScope, $scope, $http, $route, $location, $translate) {
    var description = ''
    if ($rootScope.currentAppDefinition.description) {
      description = $rootScope.currentAppDefinition.description
    }

    var saveDialog = {
      name: $rootScope.currentAppDefinition.name,
      key: $rootScope.currentAppDefinition.key,
      description: description,
      publish: false
    }

    $scope.saveDialog = saveDialog

    $scope.status = {
      loading: false
    }

    $scope.cancel = function() {
      $scope.$hide()
    }

    $scope.saveAndClose = function(force) {
      $scope.save(function() {
        $location.path('/apps')
      }, force)
    }

    $scope.save = function(saveCallback, force) {
      if (
        !$scope.saveDialog.name ||
        $scope.saveDialog.name.length == 0 ||
        !$scope.saveDialog.key ||
        $scope.saveDialog.key.length == 0
      ) {
        return
      }

      // Indicator spinner image
      $scope.status.loading = true

      var data = {
        appDefinition: $rootScope.currentAppDefinition,
        publish: $scope.saveDialog.publish
      }

      data.appDefinition.name = $scope.saveDialog.name
      if ($scope.saveDialog.description && $scope.saveDialog.description.length > 0) {
        data.appDefinition.description = $scope.saveDialog.description
      }

      if (force !== undefined && force !== null && force === true) {
        data.force = true
      }

      delete $scope.conflict
      $http({
        method: 'PUT',
        url: FLOWABLE.APP_URL.getAppDefinitionUrl($rootScope.currentAppDefinition.id),
        data: data
      })
        .success(function(response, status, headers, config) {
          // Regular error
          if (response.error) {
            $scope.status.loading = false
            $scope.saveDialog.errorMessage = response.errorDescription
          } else {
            $scope.$hide()
            $rootScope.addAlert($translate.instant('APP.POPUP.SAVE-APP-SAVE-SUCCESS', 'info'))
            if (saveCallback) {
              saveCallback()
            }
          }
        })
        .error(function(data, status, headers, config) {
          $scope.status.loading = false
          $scope.saveDialog.errorMessage = data.message
        })
    }

    $scope.isOkButtonDisabled = function() {
      if ($scope.status.loading) {
        return false
      } else if ($scope.error && $scope.error.hasCustomStencilItem) {
        return false
      }
      return true
    }

    $scope.okClicked = function() {
      if ($scope.error) {
        if ($scope.error.conflictResolveAction === 'discardChanges') {
          $scope.close()
          $route.reload()
        } else if (
          $scope.error.conflictResolveAction === 'overwrite' ||
          $scope.error.conflictResolveAction === 'newVersion'
        ) {
          $scope.save()
        } else if ($scope.error.conflictResolveAction === 'saveAs') {
          $scope.save(function() {
            $rootScope.ignoreChanges = true // Otherwise will get pop up that changes are not saved.
            $location.path('/apps')
          })
        }
      }
    }
  }
])
